package net.lab1024.sa.gateway.dto;

import org.springframework.util.MultiValueMap;

import java.io.Serializable;

/**
 * HTTP 请求数据传输对象（DTO）
 * 封装请求方法、URI、头信息、查询参数、请求体等核心属性
 */
public class HttpRequestDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    // HTTP 请求方法（GET/POST/PUT/DELETE 等）
    private String method;

    // 请求目标 URI（如 /api/order/123）
    private String uri;

    // 请求头（支持多值，如 Cookie、Accept 等）
    private MultiValueMap<String, String> headers;

    // 查询参数（URL 中的 ?key=value&... 部分）
    private MultiValueMap<String, String> queryParams;

    // 请求体（JSON/表单等数据，根据 Content-Type 解析）
    private Object body;

    // 协议类型（HTTP/HTTPS/Dubbo 等，用于多协议转发）
    private String protocol;

    // ==================================== 构造方法 ====================================

    /**
     * 默认构造方法（JSON 反序列化、反射创建时需要）
     */
    public HttpRequestDTO() {
    }

    /**
     * 全参构造方法（用于快速创建请求对象）
     */
    public HttpRequestDTO(String method, String uri, MultiValueMap<String, String> headers,
                          MultiValueMap<String, String> queryParams, Object body, String protocol) {
        this.method = method;
        this.uri = uri;
        this.headers = headers;
        this.queryParams = queryParams;
        this.body = body;
        this.protocol = protocol;
    }

    // ==================================== Getter/Setter ====================================
    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public MultiValueMap<String, String> getHeaders() {
        return headers;
    }

    public void setHeaders(MultiValueMap<String, String> headers) {
        this.headers = headers;
    }

    public MultiValueMap<String, String> getQueryParams() {
        return queryParams;
    }

    public void setQueryParams(MultiValueMap<String, String> queryParams) {
        this.queryParams = queryParams;
    }

    public Object getBody() {
        return body;
    }

    public void setBody(Object body) {
        this.body = body;
    }

    public String getProtocol() {
        return protocol;
    }

    public void setProtocol(String protocol) {
        this.protocol = protocol;
    }
}